{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Logistic 回归——皮马印第安人糖尿病数据分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入必要的工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "train = pd.read_csv(\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "无数据缺失，不需要进行数据缺失处理。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 各属性的统计特性\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Outcome 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(train.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡且样本量较少，因此采用交叉验证。交叉验证对分类任务缺省的是采用StratifiedKFold，在每折采样时根据各类样本按比例采样"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# drop ids and get labels\n",
    "y_all= train['Outcome'].values\n",
    "x_all = train.drop([\"Outcome\"], axis=1)\n",
    "x_all = np.array(x_all)\n",
    "#y_train\n",
    "#x_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(614, 8)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "x_train, x_test, y_train, y_test = train_test_split(x_all, y_all, random_state=33, test_size=0.2)\n",
    "x_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#y_train.reshape(-1,1)\n",
    "#y_train\n",
    "#y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(154, 8)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理-Logistic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "#x_train = ss_X.fit_transform(x_train)\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "x_train = ss_X.fit_transform(x_train)\n",
    "x_test = ss_X.transform(x_test)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Default Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率 0.7818547849677333 [0.78225806 0.76422764 0.7398374  0.81147541 0.81147541]\n",
      "logloss of each fold is:  [0.46129644 0.46510588 0.56426612 0.44377717 0.46617809]\n",
      "cv logloss is: 0.48012474004701094\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr= LogisticRegression()\n",
    "\n",
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "#分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "from sklearn.cross_validation import cross_val_score\n",
    "\n",
    "#训练模型\n",
    "lr.fit(x_train,y_train)\n",
    "scores=cross_val_score(lr,x_train, y_train, cv=5)\n",
    "print '准确率',np.mean(scores),scores\n",
    "\n",
    "loss = cross_val_score(lr, x_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "print 'logloss of each fold is: ',-loss\n",
    "print'cv logloss is:', -loss.mean()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "不管在测试集或者训练集上模型的准确率都不是很高。可能样本的非线性特性比较强。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 正则化的 Logistic Regression及参数调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "logistic回归的需要调整超参数有：C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "目标函数为：J = sum(logloss(f(xi), yi)) + C* penalty \n",
    "\n",
    "在sklearn框架下，不同学习器的参数调整步骤相同：\n",
    "设置候选参数集合\n",
    "调用GridSearchCV\n",
    "调用fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='accuracy', verbose=0)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='accuracy')\n",
    "#grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')\n",
    "grid.fit(x_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/ice2018/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00092182, 0.00111814, 0.00067225, 0.00105124, 0.00082326,\n",
       "        0.00099845, 0.00096159, 0.00101342, 0.00102959, 0.00101123,\n",
       "        0.00099916, 0.00103893, 0.00110679, 0.00114675]),\n",
       " 'mean_score_time': array([0.00031981, 0.00027866, 0.00035658, 0.00023818, 0.00023713,\n",
       "        0.00023503, 0.00023918, 0.00024099, 0.00023737, 0.00023303,\n",
       "        0.00023556, 0.00023446, 0.00029979, 0.00024705]),\n",
       " 'mean_test_score': array([0.65309446, 0.76058632, 0.70521173, 0.76710098, 0.77198697,\n",
       "        0.78175896, 0.7752443 , 0.78175896, 0.78175896, 0.78175896,\n",
       "        0.78175896, 0.78175896, 0.78175896, 0.78175896]),\n",
       " 'mean_train_score': array([0.65309498, 0.76548404, 0.70521618, 0.77973157, 0.78013641,\n",
       "        0.78175828, 0.78257461, 0.78053711, 0.78135261, 0.78094445,\n",
       "        0.78094445, 0.78094445, 0.78094445, 0.78094445]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10, 10, 100,\n",
       "                    100, 1000, 1000],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'rank_test_score': array([14, 12, 13, 11, 10,  1,  9,  1,  1,  1,  1,  1,  1,  1],\n",
       "       dtype=int32),\n",
       " 'split0_test_score': array([0.65322581, 0.75806452, 0.69354839, 0.75806452, 0.76612903,\n",
       "        0.78225806, 0.77419355, 0.78225806, 0.78225806, 0.78225806,\n",
       "        0.78225806, 0.78225806, 0.78225806, 0.78225806]),\n",
       " 'split0_train_score': array([0.65306122, 0.7755102 , 0.70816327, 0.78571429, 0.77959184,\n",
       "        0.7755102 , 0.78163265, 0.77959184, 0.78163265, 0.77959184,\n",
       "        0.77959184, 0.77959184, 0.77959184, 0.77959184]),\n",
       " 'split1_test_score': array([0.6504065 , 0.74796748, 0.70731707, 0.73170732, 0.74796748,\n",
       "        0.75609756, 0.74796748, 0.76422764, 0.76422764, 0.76422764,\n",
       "        0.76422764, 0.76422764, 0.76422764, 0.76422764]),\n",
       " 'split1_train_score': array([0.65376782, 0.76578411, 0.70468432, 0.78004073, 0.79022403,\n",
       "        0.78411405, 0.78615071, 0.78004073, 0.78004073, 0.78004073,\n",
       "        0.78004073, 0.78004073, 0.78004073, 0.78004073]),\n",
       " 'split2_test_score': array([0.6504065 , 0.73170732, 0.68292683, 0.75609756, 0.73170732,\n",
       "        0.74796748, 0.7398374 , 0.7398374 , 0.7398374 , 0.7398374 ,\n",
       "        0.7398374 , 0.7398374 , 0.7398374 , 0.7398374 ]),\n",
       " 'split2_train_score': array([0.65376782, 0.77393075, 0.7107943 , 0.78818737, 0.78615071,\n",
       "        0.79022403, 0.78411405, 0.78207739, 0.78411405, 0.78411405,\n",
       "        0.78411405, 0.78411405, 0.78411405, 0.78411405]),\n",
       " 'split3_test_score': array([0.6557377 , 0.81147541, 0.75409836, 0.79508197, 0.80327869,\n",
       "        0.81147541, 0.81147541, 0.81147541, 0.81147541, 0.81147541,\n",
       "        0.81147541, 0.81147541, 0.81147541, 0.81147541]),\n",
       " 'split3_train_score': array([0.65243902, 0.75      , 0.69308943, 0.77235772, 0.7703252 ,\n",
       "        0.77845528, 0.7804878 , 0.77845528, 0.77845528, 0.77845528,\n",
       "        0.77845528, 0.77845528, 0.77845528, 0.77845528]),\n",
       " 'split4_test_score': array([0.6557377 , 0.75409836, 0.68852459, 0.79508197, 0.81147541,\n",
       "        0.81147541, 0.80327869, 0.81147541, 0.81147541, 0.81147541,\n",
       "        0.81147541, 0.81147541, 0.81147541, 0.81147541]),\n",
       " 'split4_train_score': array([0.65243902, 0.76219512, 0.70934959, 0.77235772, 0.77439024,\n",
       "        0.7804878 , 0.7804878 , 0.78252033, 0.78252033, 0.78252033,\n",
       "        0.78252033, 0.78252033, 0.78252033, 0.78252033]),\n",
       " 'std_fit_time': array([1.37076593e-04, 3.70422205e-04, 1.01948030e-04, 3.74049571e-04,\n",
       "        5.40458687e-05, 1.21489649e-05, 2.20778179e-05, 9.17041044e-06,\n",
       "        9.68970886e-05, 1.47284802e-05, 3.69256119e-05, 3.77312298e-05,\n",
       "        2.01868739e-04, 2.42269571e-04]),\n",
       " 'std_score_time': array([3.47377097e-05, 4.28335151e-05, 2.17894422e-04, 9.99198583e-06,\n",
       "        1.67640646e-06, 1.83690646e-06, 4.30581578e-06, 1.00219782e-05,\n",
       "        2.01516596e-06, 1.31972814e-06, 2.21100294e-06, 2.13567693e-06,\n",
       "        8.60400560e-05, 2.10907614e-05]),\n",
       " 'std_test_score': array([0.00238217, 0.02689208, 0.02565232, 0.0245526 , 0.03085317,\n",
       "        0.02667652, 0.02859017, 0.02765143, 0.02765143, 0.02765143,\n",
       "        0.02765143, 0.02765143, 0.02765143, 0.02765143]),\n",
       " 'std_train_score': array([0.0005945 , 0.00919275, 0.00639104, 0.00657474, 0.00731446,\n",
       "        0.00507506, 0.00222509, 0.0015349 , 0.00195873, 0.00206746,\n",
       "        0.00206746, 0.00206746, 0.00206746, 0.00206746])}"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# view the complete results (list of named tuples)\n",
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7817589576547231\n",
      "{'penalty': 'l2', 'C': 0.1}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "得出最佳的正则是l2正则，正则参数为0.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7337662337662337"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#y_grid_predict=grid.predict(x_test)\n",
    "#用最优的分类器在测试集上进行测试。\n",
    "grid.score(x_test,y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "from sklearn import metrics\n",
    "\n",
    "SVC1 = LinearSVC().fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.75      0.89      0.81        99\n",
      "          1       0.69      0.45      0.55        55\n",
      "\n",
      "avg / total       0.73      0.73      0.72       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[88 11]\n",
      " [30 25]]\n"
     ]
    }
   ],
   "source": [
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(x_test)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, metrics.classification_report(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性SVM正则参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, x_train, y_train, x_test, y_test):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(x_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(x_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.727272727273\n",
      "accuracy: 0.733766233766\n",
      "accuracy: 0.74025974026\n",
      "accuracy: 0.74025974026\n",
      "accuracy: 0.746753246753\n",
      "accuracy: 0.733766233766\n",
      "accuracy: 0.714285714286\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, x_train, y_train, x_test, y_test)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最佳C为10，正确率为 0.746753246753\n",
    "\n",
    "跟上述正则化的Logistic回归分类器与线性SVM准确率差不多，原因可能是由于这两个都是线性模型，在样本线性特性比较好的情况下，两者之间的性能差不多。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC\n",
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.707792207792\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.649350649351\n",
      "accuracy: 0.733766233766\n",
      "accuracy: 0.74025974026\n",
      "accuracy: 0.707792207792\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.649350649351\n",
      "accuracy: 0.727272727273\n",
      "accuracy: 0.753246753247\n",
      "accuracy: 0.727272727273\n",
      "accuracy: 0.688311688312\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.649350649351\n",
      "accuracy: 0.727272727273\n",
      "accuracy: 0.75974025974\n",
      "accuracy: 0.746753246753\n",
      "accuracy: 0.662337662338\n",
      "accuracy: 0.688311688312\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.727272727273\n",
      "accuracy: 0.746753246753\n",
      "accuracy: 0.746753246753\n",
      "accuracy: 0.733766233766\n",
      "accuracy: 0.655844155844\n",
      "accuracy: 0.688311688312\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.753246753247\n",
      "accuracy: 0.75974025974\n",
      "accuracy: 0.74025974026\n",
      "accuracy: 0.714285714286\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.688311688312\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.753246753247\n",
      "accuracy: 0.746753246753\n",
      "accuracy: 0.733766233766\n",
      "accuracy: 0.662337662338\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.688311688312\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n",
      "accuracy: 0.642857142857\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 5,8)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-5, 5, 11)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, x_train, y_train, x_test, y_test)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以从图中找到最优的gamma为0.0001，C为10000，最高的的分为0.75974025974"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
